package study.java.jdk.jdk8._1_stream.intermediate;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import study.java.jdk.jdk8.User1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * （1）filter 方法用于通过设置的条件过滤出元素
 * （2）对于 Stream 中包含的元素使用给定的过滤函数进行过滤操作，新生成的 Stream 只包含符合条件的元素
 */
@Slf4j
public class _1_filter_Test {

    /**
     * ==============================
     * （1）
     * ==============================
     *
     * @param predicate Predicate（断言）
     */
    @Test
    public void test() {
        List<String> src = Arrays.asList("abc", "123", "", "");
        //
        List<String> dest = src.stream().filter(String::isEmpty).collect(Collectors.toList());
        log.info(">>>>>> {}", dest);
        //
        src.stream().filter(e -> !e.isEmpty());
        dest = src.stream()
                .filter(e -> {
                    log.info(">>> {}", e);
                    if (!e.isEmpty()) {
                        return true;
                    } else {
                        return false;
                    }
                })
                .filter(e -> !e.isEmpty())
                .collect(Collectors.toList());
        log.info(">>> {}", dest);
    }

    @Test
    public void test2() {
        User1 u1 = User1.builder().code("abc").build();
        User1 u2 = User1.builder().code("123").build();
        List<User1> src = Arrays.asList(u1, u2);

        List<User1> uLt = new ArrayList<>();
        List<User1> dest = src.stream()
                .filter(u -> {
                    if ("s2_switch".equals(u.getCode())) {
                        uLt.add(u);
                    }
                    return true;
                })
                .collect(Collectors.toList());
        log.info(">>> {}", dest);
        log.info(">>> {}", uLt);
    }

    @Test
    public void test3() {
        Map<String, String> map = Maps.newHashMap();
        map.put("1", "a");
        map.put("2", "b");
        Arrays.asList("1", "2", "3", "4", "5").stream()
                .filter(e -> map.containsKey(e))
                .forEach(System.out::println);
    }
}
